﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace PingPong
{
    class Bola : Object 
    {
        SoundEffect soundEffect;
        public float VelocidadeX = 0.0f;
        public float VelocidadeY = 0.0f;

        float udist = 0.0f;       // Var para player 1
        float ufraction = 0.0f;   // Var para player 1

        float edist = 0.0f;       // Var para player 2
        float efraction = 0.0f;   // Var para player 2

        float speedTotal = 7.5f;
        float speedMax = 6.5f;
        float oldVelocidadeX;
     
        int ControlaTecla = 0;
        Random random = new Random(); 




        public Bola(GameWindow janela, Texture2D textura, Vector2 position, SoundEffect soundEffect)
            :base(janela,textura,position)  
        {
            this.size = textura.Bounds;
            this.position = new Vector2((janela.ClientBounds.Width / 2 - this.size.Width / 2), (janela.ClientBounds.Height / 2 - this.size.Height / 2));   
            this.soundEffect = soundEffect;  
        }

        public override void Update(){}

        public void Update(GameTime gametime, GameWindow janela, Pallete player1, Pallete player2, List<Keys> teclado) 
        {
            this.LancarBolaGame(teclado, gametime); 
            ManterNaTela(janela, player1, player2);

            this.size.X = (int) position.X;
            this.size.Y = (int)position.Y;
        }

        private void LancarBolaGame(List<Keys> teclado, GameTime gametime)
        {
            foreach (Keys tecla in teclado)
            {
                if (ControlaTecla == 0)
                {
                    if (Keyboard.GetState().IsKeyDown(tecla) && tecla == Keys.L)
                    {
                        // verificar se o valor sorteado é maior que 5 ou menor:

                        // se maior que 5 velocidadeX tem valor negativo
                        if (random.Next(10) >= 5)
                        {
                            VelocidadeX = 6.5f;
                            VelocidadeY = 0.0f;
                        }

                        // se menor que 5 velocidadeX tem valor positivo
                        if (random.Next(10) < 5)
                        {
                            VelocidadeX = -6.5f;
                            VelocidadeY = 0.0f;
                        }
                    }
                }

                if (ControlaTecla == 1)
                {
                    if (Keyboard.GetState().IsKeyDown(tecla) && tecla == Keys.L)
                    {
                        VelocidadeX = 6.5f;
                        VelocidadeY = 0.0f;
                    }
                }

                if (ControlaTecla == 2)
                {
                    if (Keyboard.GetState().IsKeyDown(tecla) && tecla == Keys.L)
                    {
                        VelocidadeX = -6.5f;
                        VelocidadeY = 0.0f;
                    }
                }
            } 
        }

        private void ManterNaTela(GameWindow janela, Pallete player1, Pallete player2)
        {
            if (position.Y < 0 || position.Y > janela.ClientBounds.Height - texture.Height)
            {
                VelocidadeY *= -1;
                soundEffect.Play();  
            }

            if (this.position.X < 0) 
            {
                VelocidadeX *= -1;
                player2.Pontos++;
                soundEffect.Play(); 
 
                this.position.X = (janela.ClientBounds.Width / 2) - 14;
                this.position.Y = (janela.ClientBounds.Height / 2) - 10;
                VelocidadeX = 0;
                VelocidadeY = 0;
                ControlaTecla = 2;
            }

            if (this.position.X > janela.ClientBounds.Width - this.size.Width)
            {
                VelocidadeX *= -1;
                player1.Pontos++;
                soundEffect.Play();  

                this.position.X = (janela.ClientBounds.Width / 2) - 14;
                this.position.Y = (janela.ClientBounds.Height / 2) - 10;
                VelocidadeX = 0;
                VelocidadeY = 0;
                ControlaTecla = 1;
            }

            this.position.X += VelocidadeX;
            this.position.Y += VelocidadeY;

            // Teste de colisão da bola com o player 1
            if (this.GetBounding().Intersects(player1.GetBounding())) 
            {
                udist = (player1.Position.Y) - (this.position.Y + 5);

                if (udist != 0)
                {
                    ufraction = udist / (player1.Size.Height / 2);
                    VelocidadeY = -((1 - Math.Abs(ufraction)) * speedTotal);

                    oldVelocidadeX = VelocidadeX;
                    VelocidadeX = ufraction * speedTotal;

                    if (VelocidadeX < oldVelocidadeX)
                    {
                        VelocidadeX = oldVelocidadeX;
                        VelocidadeY *= (oldVelocidadeX / VelocidadeX); 
                    }
                }
                
                else if (udist == 0) {VelocidadeX = -speedTotal;}

                if (VelocidadeX < 0) {VelocidadeX = -VelocidadeX;}

                if (VelocidadeX > speedMax) {VelocidadeX = speedMax;} 
            }//Fim do teste de colisão com o player 1


            // Teste de Colisão da bola com o player 2
            if (this.GetBounding().Intersects(player2.GetBounding())) 
            {
                edist = (player2.Position.Y + 5) - (this.position.Y + 5);

                if (edist != 0)
                {
                    efraction = edist / (player2.Size.Height / 2);
                    VelocidadeY = -((1 - Math.Abs(efraction)) * speedTotal);
                    VelocidadeX = efraction * speedTotal;
                }
                
                else {VelocidadeX = speedTotal;}

                if (VelocidadeX > 0) {VelocidadeX = -VelocidadeX;}

                if (VelocidadeX > speedMax) {VelocidadeX = speedMax;} 
              } // Fim do teste de colisão com o player 2
        }

        public BoundingSphere GetBounding()
        {
            return new BoundingSphere(new Vector3(this.position.X + this.size.Width / 2,
                    this.position.Y + this.size.Height / 2, 0.0f), this.size.Width / 2);
        }

        public override void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texture, position, Color.White);      
        }
    }
}
